﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using IBatisNet.DataMapper;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.Collections;
using System.IO;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.tool.xml;
using iTextSharp.text.xml.simpleparser;
using iTextSharp.text.api;
using iTextSharp.text.xml;
using iTextSharp.text.html;
using iTextSharp.text.pdf;


namespace TumbaloSoft.Controllers
{
    public class VentasController : TumbaloController
    {
        private static Object lockObject = new Object();
        //
        // GET: /Ventas/
        public ActionResult Index()
        {
            if (defaultAction != null) return defaultAction;


             return View();
            
            
        }



        //APROBAR UN INMUEBLE

        public ActionResult AprobarInmueble(BusquedaInmueble inmuebleBuscar)
        {

            if (defaultAction != null) return defaultAction;
            IList listaDistritos = null;
            int numActivos = 0;

            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountAprobar();//BUSCA LOS QUE ESTAN REGISTRADO MAS NO EN VENTA
                ViewBag.listaDistritos = listaDistritos;
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscarParaAprobar(inmuebleBuscar);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al aprobar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = inmuebleBuscar.prPage - 1;
            ViewBag.nextPage = inmuebleBuscar.prPage + 1;
            ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
            if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(inmuebleBuscar);
        }


        [HttpPost]
        public ActionResult AprobarInmueble(BusquedaInmueble inmuebleBuscar, List<bool> Aprobar)
        {

            if (defaultAction != null) return defaultAction;
            
            Boolean existeAlguno = false;
            int numActivos = 0;
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountAprobar();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscarParaAprobar(inmuebleBuscar);

                for (int i = 0; i < Aprobar.Count; i++)
                {
                    if (Aprobar[i] == true)
                    {
                        existeAlguno = true;
                        ViewBag.ListaInmueble[i].prEstado = "EN VENTA";
                        HelperInmueble.update(ViewBag.ListaInmueble[i]);
                    }
                }

                if (existeAlguno == false)
                {
                    ViewBag.mensaje = "No se escogio ningun inmueble";
                }
                else
                {
                    ViewBag.mensaje = "Se pusieron en ventas los inmuebles seleccionados";
                }
                ViewBag.returnURL = "/Ventas";
                return View("~/Views/Shared/Exito.cshtml");

            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al aprobar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            //return View();
        }



        /*--------------------------REGISTRAR VENTA -----------------------------------------*/

        public ActionResult RegistrarVenta(int? prIdPersona, int? prIdVendedor, int? prIdInmueble)
        {

            if (defaultAction != null) return defaultAction;
            
            try
            {
                if (prIdPersona.HasValue)
                {
                    ViewBag.idPersona = prIdPersona;
                    Session["idPersona"] = prIdPersona;
                    ViewBag.TipoPersona = HelperVenta.sacaTipoPersona((int)Session["idPersona"]);
                    Session["tipoPersona"] = HelperVenta.sacaTipoPersona((int)Session["idPersona"]);

                    if (ViewBag.TipoPersona == "JURIDICA")
                    {
                        Session["razonSocial"] = HelperVenta.sacaRazonSocial((int)Session["idPersona"]);
                    }
                    else
                    {
                        Session["nombrePersona"] = HelperVenta.sacaNombrePersona((int)Session["idPersona"]);
                        Session["apellidoPaternoPersona"] = HelperVenta.sacaApellidoPaternoPersona((int)Session["idPersona"]);
                    }
                    return View();
                }
                if (prIdVendedor.HasValue)
                {
                    ViewBag.idVendedor = prIdVendedor;
                    Session["idVendedor"] = prIdVendedor;
				Vendedor vendedor = HelperVendedor.selectById((int)Session["idVendedor"]);
                    Session["porcentajeBase"] = vendedor.prPorcentajeBase;
                    Session["nombreVendedor"] = vendedor.prNombre;
                    Session["apellidoPaternoVendedor"] = vendedor.prApellidoPaterno;

                    return View();
                }
                if (prIdInmueble.HasValue)
                {
                    ViewBag.idInmueble = prIdInmueble;
                    Session["idInmueble"] = prIdInmueble;
                    Inmueble inmueble = HelperInmueble.selectById((int)Session["idInmueble"]);
                    Moneda moneda = HelperMoneda.selectById(inmueble.prMoneda.prIdMoneda);
                    TipoInmueble tipoInmueble = HelperTipoInmueble.selectById(inmueble.prTipoInmueble.prIdTipoInmueble);
                    Session["moneda"] = moneda.prDescripcion;
                    Session["valormercado"] = inmueble.prValorMercado;
                    Session["direccion"] = inmueble.prDireccion;
                    Session["tipoInmueble"] = tipoInmueble.prDescripcion;

                    return View(new MyViewModel());
                }

                else
                {
                    if (Session != null)
                        Session.RemoveAll();
                    return View(new MyViewModel());
                }


            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar una venta", ex);
                return View("~/Views/Shared/Error.cshtml");
            }


        } //Fin de Registrar Venta


        [HttpPost]
        public ActionResult RegistrarVenta(string porcentajeEmpresa, MyViewModel model)
        {
            if (defaultAction != null) return defaultAction;
            
            try
            {
                Boleta boleta = new Boleta(); Venta venta = new Venta();

                if (Session["idInmueble"] != null && Session["idPersona"] != null && Session["idVendedor"] != null && porcentajeEmpresa != "")
                {
                    Inmueble inmueble = HelperInmueble.selectById((int)Session["idInmueble"]);
                    /*creo objeto boleta */
                    boleta.prMoneda = HelperMoneda.selectById(inmueble.prMoneda.prIdMoneda);
                    boleta.prEstado = "VENDIDO";
                    lock (lockObject)
                    {
                        boleta.prIdBoleta = (int)(HelperBoleta.SiguienteCodigo());
                    }
                    boleta.prSubtotal = (float)model.Inmueble.prValorMercado;
                    boleta.prImpuestos = 19;
                    boleta.prMontoTotal = (float)model.Inmueble.prValorMercado + (float)((boleta.prImpuestos / 100) * (model.Inmueble.prValorMercado));
                  

                    /*creo objeto venta */
                    lock (lockObject)
                    {
                        venta.prBoleta = boleta;
                    }
                    venta.prInmueble = model.Inmueble;
                    venta.prInmueble.prIdInmueble = (int)(Session["idInmueble"]);
                    venta.prCliente = new Persona();
                    venta.prCliente.prIdPersona = (int)(Session["idPersona"]);
                    venta.prVendedor = model.Vendedor;
                    venta.prVendedor.prIdVendedor = (int)(Session["idVendedor"]);
                    venta.prComisionVendedor = model.Venta.prComisionVendedor;
                    venta.prComisionEmpresa = model.Venta.prComisionEmpresa;
                    lock (lockObject)
                    {
                        venta.prIdVenta = (int)(HelperVenta.SiguienteCodigo());
                    }
                    venta.prFechaVenta = DateTime.Today;


                    if (ModelState.IsValidField("Vendedor.prPorcentajeBase"))
                    {
                        lock (lockObject)
                        {
                            HelperBoleta.insert(boleta);
                            HelperVenta.insert(venta);
                        }
                        /*cambio estado a vendido el inmueble*/
                        inmueble.prEstado = "VENDIDO";
                        HelperInmueble.update(inmueble);
                        ViewBag.mensaje = "Se registro correctamente la venta  ";
                        ViewBag.returnURL = "../Ventas";
                        return View("~/Views/Shared/Exito.cshtml");
                    }
                    else { return View(model); }
                }
                else
                {
                    if (Session["idPersona"] == null) ModelState.AddModelError("nada", "Los datos del propietario son obligatorios. Complete los datos, con la búsqueda");
                    if (Session["idInmueble"] == null) ModelState.AddModelError("Inmueble.prMoneda.prDescripcion", "Los datos del Inmueble son obligatorios. Complete los datos, con la búsqueda");
                    if (Session["idVendedor"] == null) ModelState.AddModelError("Vendedor.prIdVendedor", "Los datos del Vendedor son obligatorios. Complete los datos, con la búsqueda");
                    if (porcentajeEmpresa == "") ModelState.AddModelError("porcentajeEmpresa", "Se requiere concocer el porcentaje o utilize el porcentaje por defecto");


                    return View(model);
                }
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar una venta", ex);
                return View("~/Views/Shared/Error.cshtml");
            }




        }


	   public ActionResult RegistrarComprobante(BusquedaVenta ventaBuscar)
	   {

           if (defaultAction != null) return defaultAction;
            
           try
           {
               ViewBag.listaVendedores = HelperVendedor.selectAll();
               if (ventaBuscar.prVendedor == null)
               {
                   ventaBuscar.prVendedor = new Vendedor();
                   ventaBuscar.prVendedor.prIdVendedor = 0;
               }
               ViewBag.venta = HelperVenta.buscar(ventaBuscar);
               return View(ventaBuscar);
           }
           catch(Exception ex) {
               Logger.Current.Error("Error al registrar un comprobante", ex);
               return View("~/Views/Shared/Error.cshtml");
           }
	   }

        /*-----------------METODOS USADOS DE AYUDA PARA REGISTRAR VENTA ------------------*/
        public ActionResult IndexInmueble(BusquedaInmueble inmuebleBuscar)
        {

            if (defaultAction != null) return defaultAction;
            
            try
            {
                IList listaDistritos = null;
                int numActivos = 0;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();

                listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountActivos();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscarCatalogo(inmuebleBuscar);

                ViewBag.prevPage = inmuebleBuscar.prPage - 1;
                ViewBag.nextPage = inmuebleBuscar.prPage + 1;
                ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
                if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

                ViewBag.listaDistritos = listaDistritos;

                return View(inmuebleBuscar);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al visualizar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }


        public ActionResult IndexVendedor(BusquedaVendedor vendedorBuscar)
        {
            if (defaultAction != null) return defaultAction;
            
            int numActivos = 0;
            try
            {
                numActivos = HelperVendedor.selectCountActivos();
			 ViewBag.ListaVendedor = HelperVendedor.buscar(vendedorBuscar);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al visualizar un vendedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = vendedorBuscar.prPage - 1;
            ViewBag.nextPage = vendedorBuscar.prPage + 1;
            ViewBag.numPages = numActivos / vendedorBuscar.prPageSize;
            if ((numActivos % vendedorBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(vendedorBuscar);

        }

        public ActionResult BuscarClienteIndex()
        {
            return View();
        }


        [HttpPost]
        public ActionResult BuscarClienteIndex(string tipoPersona)
        {

            if (defaultAction != null) return defaultAction;
            
            try
            {
                if (tipoPersona == "N") return RedirectToAction("IndexPersonaNatural");
                else return RedirectToAction("IndexPersonaJuridica");
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al visualizar un cliente", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public ActionResult IndexPersonaNatural(BusquedaPersonaNatural personaNaturalBuscar)
        {
            if (defaultAction != null) return defaultAction;
            
            try
            {
                int numActivos = 0;


                numActivos = HelperPersonaNatural.selectCountActivos();
                ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);


                ViewBag.prevPage = personaNaturalBuscar.prPage - 1;
                ViewBag.nextPage = personaNaturalBuscar.prPage + 1;
                ViewBag.numPages = numActivos / personaNaturalBuscar.prPageSize;
                if ((numActivos % personaNaturalBuscar.prPageSize) > 0) ViewBag.numPages++;

                return View(personaNaturalBuscar);

            }
            catch(Exception ex) {
                Logger.Current.Error("Error al visualizar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); }
        }

        public ActionResult IndexPersonaJuridica(BusquedaPersonaJuridica personaJuridicaBuscar)
        {

            if (defaultAction != null) return defaultAction;
            
            try
            {
                int numActivos = 0;


                numActivos = HelperPersonaJuridica.selectCountActivos();
                ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);


                ViewBag.prevPage = personaJuridicaBuscar.prPage - 1;
                ViewBag.nextPage = personaJuridicaBuscar.prPage + 1;
                ViewBag.numPages = numActivos / personaJuridicaBuscar.prPageSize;
                if ((numActivos % personaJuridicaBuscar.prPageSize) > 0) ViewBag.numPages++;

                return View(personaJuridicaBuscar);

            }
            catch(Exception ex) {
                Logger.Current.Error("Error al visualizar una persona natural", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }


        }


        //REGISTRAR CITA:
        public ActionResult RegistrarCitaVentas(BusquedaCita citaBuscar)
        {
            if (defaultAction != null) return defaultAction;
            
            int numActivos = 0;
            try
            {

                numActivos = HelperCita.selectCountActivos();
                if (citaBuscar.prFechaCitaMin.Year < 1900) citaBuscar.prFechaCitaMin = new DateTime(1900, 1, 1);
                if (citaBuscar.prFechaCitaMax.Year < 1900) citaBuscar.prFechaCitaMax = new DateTime(2500, 1, 1);
                ViewBag.ListaCita = HelperCita.buscar(citaBuscar);
                ViewBag.ListaInmueble = HelperInmueble.selectAll();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al registrar cita ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

            ViewBag.prevPage = citaBuscar.prPage - 1;
            ViewBag.nextPage = citaBuscar.prPage + 1;
            ViewBag.numPages = numActivos / citaBuscar.prPageSize;
            if ((numActivos % citaBuscar.prPageSize) > 0) ViewBag.numPages++;

            return View(citaBuscar);
        }

        //MODIFICAR LA CITA:
        public ActionResult ModificarCita(int? prIdCita, MyViewModel model)
        {
            if (defaultAction != null) return defaultAction;
            
            if (!prIdCita.HasValue)
            {
                return View("~/Views/Shared/Error.cshtml");
            }
            else
            {
                try
                {
                    ViewBag.listaDistrito = HelperDistrito.selectAll();    
                ViewBag.ListaVendedores = HelperVendedor.selectAll();
                
                model = new MyViewModel();
                model.Cita = HelperCita.selectById(prIdCita.Value);
                model.Inmueble = HelperInmueble.selectById(model.Cita.prInmueble.prIdInmueble);

                    //COMO HAGO CON LA PERSONA??
                    if (HelperPersonaNatural.EsPersonaNatural(model.Cita.prIdCliente) == true)
                    {
                        model.PersonaNatural = HelperPersonaNatural.selectById(model.Cita.prIdCliente);
                        model.PersonaJuridica = null;
                    }
                    else
                    {
                        model.PersonaJuridica = HelperPersonaJuridica.selectById(model.Cita.prIdCliente);
                        model.PersonaNatural = null;
                    }
                    return View(model);

                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al modificar cita ", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
        }

        [HttpPost]
        public ActionResult ModificarCita(int? prIdCita, MyViewModel model, DateTime? prFechaFinal, int hora, int? idVendedor)
        {

            if (defaultAction != null) return defaultAction;
            
            try

            {
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                ViewBag.ListaVendedores = HelperVendedor.selectAll();//SOLO ME DA LOS ID
                List<Vendedor> vendedores = new List<Vendedor>();
                foreach (Vendedor vendedor in ViewBag.ListaVendedores)
                {
                    vendedores.Add(vendedor);
                }

                if (prFechaFinal == null)
                {
                    ModelState.AddModelError("Cita.prFecha", "Se debe ingresar una fecha");
                    return View(model);
                }
                if (fechaCorrecta(prFechaFinal.Value) == false)
                {
                    ModelState.AddModelError("Cita.prFecha", "Se debe ingresar una fecha correcta");
                    return View(model);
                }

                model.Cita = HelperCita.selectById(prIdCita.Value);
                model.Inmueble = HelperInmueble.selectById(model.Cita.prInmueble.prIdInmueble);
                if (HelperCita.PuedeVendedor(model.Cita.prEmpleado.prIdVendedor, prFechaFinal.Value, hora, model.Cita.prInmueble.prIdInmueble, vendedores) == false)
                {
                    ModelState.AddModelError("Cita.prFechaFinal", "El vendedor no se encuentra disponible");
                    return View(model);
                }

                //LA HORA Y EL VENDEDOR SE PODRAN SELECCIONAR AUTOMATICAMENTE YA QUE ESTAN EN UN COMBOBOX
                if (prIdCita.HasValue == true)
                {

                    model.Cita.prFecha = prFechaFinal.Value;
                    model.Cita.prFechaFinal = prFechaFinal.Value;
                    model.Cita.prEstado = "APROBADO";
                    model.Cita.prEmpleado.prIdVendedor = idVendedor.Value;
                    model.Cita.prHora = hora;
                    HelperCita.update(model.Cita);
                    ViewBag.mensaje = "Se modifico correctamente la cita";
                    ViewBag.returnURL = "../Ventas";
                    return View("~/Views/Shared/Exito.cshtml");
                }

                return View();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al modificar cita ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        public Boolean fechaCorrecta(DateTime fecha)
        {
          
            
            try
            {
                if (new DateTime(fecha.Year, fecha.Month, fecha.Day) > DateTime.Today) return true;
                else return false;
            }
            catch(Exception ex)
                
            {
                Logger.Current.Error("Error al evaluar la fecha correcta", ex);
                return false;
            }

        }



        /*-----------------FIN DE METODOS USADOS DE AYUDA PARA REGISTRAR VENTA ------------------*/


        /*-----------------------REPORTE VENTAS -------------------------------------*/

        public ActionResult ReporteVentas()
        {
           
            

            return View();
        }



        public ActionResult ReporteVentaRegistradas()
        {
            
            
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                return View();
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al registrar un reporte de venta registradas ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            
        }




        [HttpPost]
        public ActionResult ReporteVentaRegistradas(BusquedaVenta busqueda, String tipoReporte)
        {



            try
            {
                PersonaNatural personaN;
                personaN = HelperPersonaNatural.selectById(AccountController.getIdPersona(HttpContext));
                ViewBag.nombrePersona = personaN.prNombre + " " + personaN.prApellidoPaterno + " ";

                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                if (tipoReporte.ToUpper() == "HTML") return RedirectToAction("ReporteVentaRegistradas1", busqueda);
                else
                {

                    if (EstaDentrodeFecha(busqueda.prFechaInicio) && EstaDentrodeFecha(busqueda.prFechaFin))
                    {
                        List<Venta> listaVentas = HelperVenta.buscarVentas(busqueda);
                        if (listaVentas.Count != 0)
                        {
                            HelperPDF.HtmlToPDF("Ventas/ReporteVentaRegistradas1?prFechaInicio=" + busqueda.prFechaInicio.ToString("MM/dd/yyyy") + "&prFechaFin=" + busqueda.prFechaFin.ToString("MM/dd/yyyy") + "&prIdTipoInmueble=" + busqueda.prIdTipoInmueble, "Reporte de Ventas", 0, this);
                            return View();
                        }


                        if (listaVentas.Count == 0)
                        {

                            string mensaje = "No se encontró ningún resultado para la búsqueda";
                            ViewBag.mensaje = mensaje;
                            return View("ReporteVentaRegistradas");

                        }
                    }

                    return RedirectToAction("ReporteVentaRegistradas1");

                }
            }
            catch (Exception ex)
            {
                Logger.Current.Error("Error al  registrar reporte venta registradas ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }



        public ActionResult ReporteVentaRegistradas1(BusquedaVenta busqueda,String tipoReporte)
        {
           
            
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                if (!EstaDentrodeFecha(busqueda.prFechaInicio) && !EstaDentrodeFecha(busqueda.prFechaFin))
                {
                    ModelState.AddModelError("prFechaFin", "El campo fecha de fin es obligatorio");
                    ModelState.AddModelError("prFechaInicio", "El campo fecha de inicio es obligatorio");
                    ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                    return View("ReporteVentaRegistradas", busqueda);
                }


                if (!EstaDentrodeFecha(busqueda.prFechaInicio))
                {
                    ModelState.AddModelError("prFechaInicio", "El campo fecha de inicio es obligatorio");
                    ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                    return View("ReporteVentaRegistradas", busqueda);
                }
                if (!EstaDentrodeFecha(busqueda.prFechaFin))
                {
                    ModelState.AddModelError("prFechaFin", "El campo fecha de fin es obligatorio");
                    ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                    return View("ReporteVentaRegistradas", busqueda);
                }
                if (!fechaCorrecta2(busqueda.prFechaFin, busqueda.prFechaInicio))
                {
                    string mensajeFecha = "La Fecha Fin debe ser mayor que la Fecha Inicial";
                    ViewBag.mensajeFecha = mensajeFecha;
                    ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                    return View("ReporteVentaRegistradas", busqueda);
                }



                ViewBag.ListaVentas = HelperVenta.buscarVentas(busqueda);

                List<Venta> listaVentas = HelperVenta.buscarVentas(busqueda);
             
                if (tipoReporte == "PDF" && EstaDentrodeFecha(busqueda.prFechaInicio) && EstaDentrodeFecha(busqueda.prFechaFin) && listaVentas.Count != 0)
                {
                    HelperPDF.HtmlToPDF("Ventas/ReporteVentaRegistradas1?prFechaInicio=" + busqueda.prFechaInicio.ToString("MM/dd/yyyy") + "&prFechaFin=" + busqueda.prFechaFin.ToString("MM/dd/yyyy") + "&prIdTipoInmueble=" + busqueda.prIdTipoInmueble, "Reporte de Ventas", 0, this);
  
                }
   
                if (listaVentas.Count != 0)
                {
                    List<Vendedor> vendedor = new List<Vendedor>();
                    List<Boleta> boleta = new List<Boleta>();
                    List<Inmueble> inmueble = new List<Inmueble>();


                    foreach (Venta l in listaVentas)
                    {

                        Vendedor vend = HelperVendedor.selectById(l.prVendedor.prIdVendedor);
                        Boleta bol = HelperBoleta.selectById(l.prBoleta.prIdBoleta);
                        Inmueble inmueb = HelperInmueble.selectById(l.prInmueble.prIdInmueble);
                        TipoInmueble tipoInm = HelperTipoInmueble.selectById(inmueb.prTipoInmueble.prIdTipoInmueble);
                        inmueb.prTipoInmueble = tipoInm;

                        vendedor.Add(vend);
                        boleta.Add(bol);
                        inmueble.Add(inmueb);
                    }

                    double montoTotal = 0;
                    foreach (Boleta bolet in boleta)
                    {
                        montoTotal += bolet.prMontoTotal;
                    }

                    ViewBag.montoTotal = montoTotal;
                    ViewBag.vendedor = vendedor;
                    ViewBag.boleta = boleta;
                    ViewBag.inmueble = inmueble;


                    return View(busqueda);
                }
                else
                {

                    string mensaje = "No se encontró ningún resultado para la búsqueda";
                    ViewBag.mensaje = mensaje;
                    return View("ReporteVentaRegistradas");


                }
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar reporte de ventas ", ex);
                return View("~/Views/Shared/Error.cshtml");         
            }

        }

        public Boolean EstaDentrodeFecha(DateTime fecha)
        {
           
            
            int year = DateTime.Today.Year - fecha.Year;

            if ((year >= 0) && (year < 10)) return true;
            else return false;

        }

        /* --------------FIN DE REPORTE VENTAS----------*/

        /*------------------REPORTE DE COMISIONES X VENDEDOR---------------*/

        public ActionResult ReporteComisionesxVendedor()
        {
            if (defaultAction != null) return defaultAction;
            
            ViewBag.listaVendedores = HelperVendedor.selectAll();

            return View();
        }




        [HttpPost]
        public ActionResult ReporteComisionesxVendedor(BusquedaVenta busqueda, String tipoReporte)
        {

            PersonaNatural personaN;
            personaN = HelperPersonaNatural.selectById(AccountController.getIdPersona(HttpContext));
            ViewBag.nombrePersona = personaN.prNombre + " " + personaN.prApellidoPaterno + " ";
            
            try
            {
                ViewBag.listaVendedores = HelperVendedor.selectAll();
                if (tipoReporte.ToUpper() == "HTML") return RedirectToAction("ReporteComisionesxVendedor1",busqueda);
                else
                {





                    if (EstaDentrodeFecha(busqueda.prFechaInicio) && EstaDentrodeFecha(busqueda.prFechaFin))
                    {
                        List<Venta> listaVentas = HelperVenta.buscarVentas(busqueda);
                        if (listaVentas.Count != 0)
                        {
                            HelperPDF.HtmlToPDF("Ventas/ReporteComisionesxVendedor1?prFechaInicio=" + busqueda.prFechaInicio.ToString("MM/dd/yyyy") + "&prFechaFin=" + busqueda.prFechaFin.ToString("MM/dd/yyyy") + "&prIdVendedor=" + busqueda.prIdVendedor, "Reporte de Comisiones", 0, this);
                            return View();
                        }



                        if (listaVentas.Count == 0)
                        {
                            string mensaje = "No se encontró ningún resultado para la búsqueda";
                            ViewBag.mensaje = mensaje;
                            return View("ReporteComisionesxVendedor");

                        }
                    }
                    return RedirectToAction("ReporteComisionesxVendedor1");
                    
                }
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar reporte comisiones por vendedor ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }





        public ActionResult ReporteComisionesxVendedor1(BusquedaVenta busqueda,String tipoReporte)
        {
           
            
            try
            {
                ViewBag.listaVendedores = HelperVendedor.selectAll();
                
                if (!EstaDentrodeFecha(busqueda.prFechaInicio) && !EstaDentrodeFecha(busqueda.prFechaFin))
                {

                    ModelState.AddModelError("prFechaFin", "El campo fecha de fin es obligatorio");
                    ModelState.AddModelError("prFechaInicio", "El campo fecha de inicio es obligatorio");
                    return View("ReporteComisionesxVendedor", busqueda);
                }


                if (!EstaDentrodeFecha(busqueda.prFechaInicio))
                {
                    ModelState.AddModelError("prFechaInicio", "El campo fecha de inicio es obligatorio");
                    return View("ReporteComisionesxVendedor", busqueda);
                }
                if (!EstaDentrodeFecha(busqueda.prFechaFin))
                {
                    ModelState.AddModelError("prFechaFin", "El campo fecha de fin es obligatorio");
                    return View("ReporteComisionesxVendedor", busqueda);
                }

                if (!fechaCorrecta2(busqueda.prFechaFin, busqueda.prFechaInicio))
                {
                    string mensajeFecha = "La Fecha Fin debe ser mayor que la Fecha Inicial";
                    ViewBag.mensajeFecha = mensajeFecha;
                    ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                    return View("ReporteComisionesxVendedor", busqueda);
                }


                List<Venta> listaVentas = HelperVenta.buscarVentas(busqueda);
                if (tipoReporte == "PDF" && EstaDentrodeFecha(busqueda.prFechaInicio) && EstaDentrodeFecha(busqueda.prFechaFin) && listaVentas.Count != 0)
                {
                    HelperPDF.HtmlToPDF("Ventas/ReporteComisionesxVendedor1?prFechaInicio=" + busqueda.prFechaInicio.ToString("MM/dd/yyyy") + "&prFechaFin=" + busqueda.prFechaFin.ToString("MM/dd/yyyy") + "&prIdVendedor=" + busqueda.prIdVendedor, "Reporte de Comisiones", 0, this);
                }
   

                ViewBag.ListaVentas = HelperVenta.buscarVentas(busqueda);
               // int cuenta = 0;
                 Session["cuenta"]=0;
                if (listaVentas.Count != 0)
                {
                    List<Vendedor> vendedor = new List<Vendedor>();
                    List<Boleta> boleta = new List<Boleta>();
                    


                    foreach (Venta l in listaVentas)
                    {

                        Vendedor vend = HelperVendedor.selectById(l.prVendedor.prIdVendedor);
                        Boleta bol = HelperBoleta.selectById(l.prBoleta.prIdBoleta);
                        vendedor.Add(vend);
                        boleta.Add(bol);
                    }



                    ViewBag.vendedor = vendedor;
                    ViewBag.boleta = boleta;

                    double comisiones = 0;
                    foreach (Venta v in listaVentas)
                    {
                        comisiones += v.prComisionVendedor;
                    }
                    ViewBag.comisiones=comisiones;
                    string fechaActual = DateTime.Now.ToShortDateString();
                    Session["fechaActual"] = fechaActual;

                    return View(busqueda);
                }
                else
                {
                    string mensaje = "No se encontró ningún resultado para la búsqueda";
                    ViewBag.mensaje = mensaje;

                    return View("ReporteComisionesxVendedor");
                }
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar reporte comisiones por vendedor ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }



        public Boolean fechaCorrecta2(DateTime fecha1,DateTime fecha2)
        {
            try
            {
                if (new DateTime(fecha1.Year, fecha1.Month, fecha1.Day) > new DateTime(fecha2.Year, fecha2.Month, fecha2.Day)) return true;
                else return false;
            }
            catch
            {
                return false;
            }

        }

        /* -----------------FIN DE REPORTE COMISIONES X VENDEDOR --------------*/

	   //VER EL CATALOGO

	   public ActionResult Catalogo(BusquedaInmueble inmuebleBuscar)
	   {
		   if (defaultAction != null) return defaultAction;
		   try
		   {
			   IList listaDistritos = null;
			   int numActivos = 0;
			   ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();

			   listaDistritos = HelperDistrito.selectAll();
			   numActivos = HelperInmueble.selectCountActivosCatalogo();
			   if (inmuebleBuscar.prTipoInmueble == null)
			   {
				   inmuebleBuscar.prTipoInmueble = new TipoInmueble();
				   inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
			   }
			   ViewBag.ListaInmueble = HelperInmueble.buscarCatalogo(inmuebleBuscar);

			   ViewBag.prevPage = inmuebleBuscar.prPage - 1;
			   ViewBag.nextPage = inmuebleBuscar.prPage + 1;
			   ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
			   if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

			   ViewBag.listaDistritos = listaDistritos;
			   return View(inmuebleBuscar);
		   }
		   catch (Exception ex)
		   {
			   Logger.Current.Error("Error al intentar cargar el catalogo", ex);
			   return View("~/Views/Shared/Error.cshtml");
		   }
	   }

    }


}
